#include "client_Cliente.h"

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

Cliente::Cliente(std::string ip, int puerto) : ip(ip), puerto(puerto) { }

Cliente::~Cliente() { }

int Cliente::iniciar(std::string nombreArchivoEntrada) {
	std::stringstream ss;
	std::string msjBienvenida;

	std::istream* archivoEntrada;

	std::string buffer;
	std::string respuesta;

	// Si no puede conectar
	if (!socket.conectar(ip, puerto)) {
		return 1;
	}

	// Seteo el mensaje para comparar
	ss << "PUERTO " << puerto << " Aceptado. Recibiendo datos...";

	// Recibo y comparo
	socket.recibir(msjBienvenida);
	std::cout << "[SERVIDOR] " << msjBienvenida << std::endl;

	if (msjBienvenida.compare(ss.str()) != 0) {
		return 2;
	}

	// Me fijo si es un archivo o si viene la info por STDIN
	if (nombreArchivoEntrada.compare("STDIN") == 0) {
		archivoEntrada = &std::cin;
	}else {
		archivoEntrada = new std::ifstream(nombreArchivoEntrada.c_str());
	}

	// Leo hasta fin de archivo
	int c = archivoEntrada->get();
	while (!archivoEntrada->eof()) {
		buffer += c;
		c = archivoEntrada->get();
	}

	// Envio el archivo
	std::cout << "[CLIENTE] Enviando datos..." << std::endl;
	socket.enviar(buffer);

	// Seteo el nuevo msj de comparacion
	ss.clear();
	ss.str("");
	ss << "Datos recibidos exitosamente. Cantidad de bytes recibidos: "
	   << buffer.length();

	// Recibo la respuesta
	socket.recibir(respuesta);
	std::cout << "[SERVIDOR] " << respuesta << std::endl;

	std::string resEsp = ss.str();
	if (respuesta.compare(ss.str()) != 0) {
		if (nombreArchivoEntrada.compare("STDIN") != 0) {
			((std::ifstream*) archivoEntrada)->close();
			delete archivoEntrada;
		}

		return 3;
	}

	// Si hace falta libero memoria
	if (nombreArchivoEntrada.compare("STDIN") != 0) {
		((std::ifstream*) archivoEntrada)->close();
		delete archivoEntrada;
	}

	return 0;
}

int Cliente::finalizar() {
	socket.desconectar();
	return socket.cerrar();
}
